home *** CD-ROM | disk | FTP | other *** search
- #include "3DDEF.H"
- #include "GLOBAL.H"
- #include "FORWARD.H"
- #include "XCODE.H"
-
- /* 文字列処理関係 */
-
- /* 表示した時の半角スペース数 */
- int
- string_disp_len(STR s)
- {
- #asm
-
- XCODE_UP equ $0ff * 拡張コードの開始 */
-
- XCODE_MARK equ $020 * マーク 0x20 - 0x29 */
- XCODE_SYSMARK equ $030 * システムマーク 0x30 - 0x3f */
- XCODE_MARKLAST equ $03f * マークの最後 */
-
- XCODE_UL equ $040 * 下線 */
-
- XCODE_RB10 equ $050 * 予約:1文字真ん中ルビ */
- XCODE_RB1 equ $051 * 1文字ルビ(半角用) */
- XCODE_RB1L equ $052 * 1文字ルビ左(全角用) */
- XCODE_RB1R equ $053 * 1文字ルビ右(全角用) */
- XCODE_RB2 equ $054 * 2文字ルビ(全角用) */
-
- movem.l d1-d2/a0,string_disp_len_save
- moveq.l #0,d0 * d0 returns disp length
- move.l 4(sp),a0 * a0 = pointer to string
-
- USERL16:
- move.b (a0)+,d1 * 1 byte move
- bmi USERL40 * 2 byte code check
- beq USERL30 * eof then return
-
- addq.l #1,d0 * anyway add 1
- cmp.b #$20,d1 * control code ?
- bge USERL16 * normal 1 byte code($20 - $7f)
- cmp.b #'I'-'@',d1 * TAB
- bne USERL17
- *0-7 -> 8, 8-15 -> 16...
- *already add 1 then 1-8 -> 8, 9-16 -> 16...
- * addq.l #7,d0
- add.w _TAB_LENGTH_1,d0
- * andi.w #%1111_1111_1111_1000,d0 * mask
- * d0 から d0 mod TAB_LENGTH を引く
- move.l d0,d2 * コピー
- divu.w _TAB_LENGTH,d2
- swap d2
- sub.w d2,d0
- bra USERL16
- USERL17
- addq.l #1,d0 * control code is 2 disp_length
- bra USERL16
-
- USERL40:
- cmp.b #$ff,d1 * xcode ?
- bne USERL405 * not xcode
-
- move.b (a0)+,d1 * get next byte
- beq USERL30
- cmp.b #XCODE_UL,d1 * 2 byte xcode ?
- ble USERL16 * underline -> loop again
- cmp.b #XCODE_RB1R,d1 * ....
- bgt USERL403
- tst.b (a0)
- beq USERL30
- tst.b 1(a0)
- beq USERL30
- addq.l #2,a0 * 1 char RUBI
- bra USERL16
- USERL403: * 2 char RUBI
- tst.b (a0)
- beq USERL30
- tst.b 1(a0)
- beq USERL30
- tst.b 2(a0)
- beq USERL30
- tst.b 3(a0)
- beq USERL30
- addq.l #4,a0
- bra USERL16
- USERL405:
- addq.l #1,d0 * anyway add 1
- cmp.b #$a0,d1
- blt USERL41
- cmp.b #$e0,d1
- blt USERL16 * normal katakana
-
- tst.b (a0)+ * next byte
- beq USERL30
- cmp.b #$f0,d1 * 1/4 kaku ?
- bge USERL16
- addq.l #1,d0 * normal zenkaku(block 2)
- bra USERL16
-
- USERL41:
- tst.b (a0)+ * next byte
- beq USERL30
- cmp.b #$80,d1 * hankaku hiragana ?
- beq USERL16
- addq.l #1,d0 * normal zenkaku(block 1)
- bra USERL16
- USERL30:
- movem.l string_disp_len_save,d1-d2/a0
- rts
- .data
- .even
- string_disp_len_save
- ds.l 3
-
- #endasm
- }
-
- int
- string_1or2_byte_code(UINT c)
- {
- if (c >= 0x100) {
- c >>= 8;
- }
- if (c && (iskanji(c) || buff_ishan2byte(c))) {
- /* 漢字の1バイト目? or 2バイト半角文字 */
- return(2);
- }
- return(1); /* EOS は1バイトコード */
- }
-
- /* 最初に見つかった拡張コードのアドレスを返す */
- /* なければ NULL を返す */
- STR
- string_search_xcode(register STR p)
- {
- while(*p) {
- if (*p == XCODE_UP) {
- return(p);
- } else {
- p += etc_char_byte_haba(p);
- }
- }
- return((STR) NULL);
- }
-
- /* 2つの行の間で送り出しがあるかどうかをチェックする */
- /* -1など = 前へ送った、0 = 送り無し、1など = 後ろへ送った */
- int
- string_2unit_check(UNIT *p1,UNIT *p2)
- {
- UBYTE w1[VERY_LONG_LINE],w2[VERY_LONG_LINE];
-
- line_get_body(w1,p1);
- line_get_body(w2,p2);
- return(string_2line_check(w1,w2));
- }
-
- /* 2つの行の間で送り出しがあるかどうかをチェックする */
- /* -1 = 前へ送った、0 = 送り無し、1 = 後ろへ送った */
- int
- string_unit_line_check(UNIT *p1,STR s2)
- {
- UBYTE w1[VERY_LONG_LINE];
-
- line_get_body(w1,p1);
- return(string_2line_check(w1,s2));
- }
-
- /* 2つの文字列の間で送り出しがあるかどうかをチェックする */
- /* - = 前へ送った、0 = 送り無し、+ = 後ろへ送った */
- /* 送ったバイト数を返す */
- int
- string_2line_check(STR s1,STR s2)
- {
- UBYTE w[VERY_LONG_LINE * 2],w0[VERY_LONG_LINE * 2];
- int l2;
-
- strcpy(w,s1);
- l2 = strlen(s2);
- strcat(w,s2);
- return(cut_line(w,w0,w,CURRENT_JIZUME) - l2);
- }
-
- /* メインの文字列だけにする */
- /* 使わないけど文字列の長さを返すかも知れない */
- int
- string_to_main_string(STR d,STR s)
- {
- register UBYTE c;
-
- while(1) {
- if (c = *s++) { /* 終了ではない */
- if (c == XCODE_UP) {
- switch(*s++) {
- case XCODE_MARK+0:
- case XCODE_MARK+1:
- case XCODE_MARK+2:
- case XCODE_MARK+3:
- case XCODE_MARK+4:
- case XCODE_MARK+5:
- case XCODE_MARK+6:
- case XCODE_MARK+7:
- case XCODE_MARK+8:
- case XCODE_MARK+9: /* マーク 0x20 - 0x29 */
- case XCODE_MARK+10:
- case XCODE_MARK+11:
- case XCODE_MARK+12:
- case XCODE_MARK+13:
- case XCODE_MARK+14:
- case XCODE_MARK+15:
-
- case XCODE_SYSMARK+0: /* システムマーク */
- case XCODE_SYSMARK+1:
- case XCODE_SYSMARK+2:
- case XCODE_SYSMARK+3:
- case XCODE_SYSMARK+4:
- case XCODE_SYSMARK+5:
- case XCODE_SYSMARK+6:
- case XCODE_SYSMARK+7:
- case XCODE_SYSMARK+8:
- case XCODE_SYSMARK+9:
- case XCODE_SYSMARK+10:
- case XCODE_SYSMARK+11:
- case XCODE_SYSMARK+12:
- case XCODE_SYSMARK+13:
- case XCODE_SYSMARK+14:
- case XCODE_SYSMARK+15:
-
- break;
- case XCODE_UL: /* 下線 */
- break;
-
- case XCODE_RB10: /* 予約:1文字真ん中ルビ */
- case XCODE_RB1: /* 1文字ルビ */
- case XCODE_RB1L: /* 1文字ルビ左(全角用) */
- case XCODE_RB1R: /* 1文字ルビ右(全角用) */
- s += 2; /* ルビであるから、2バイト文字 */
- break;
- case XCODE_RB2: /* 2文字ルビ(全角用) */
- s += 4; /* ルビであるから、2バイト文字 */
- }
- } else {
- if (isprkana(c) || (c < 0x20)) {
- /* 普通の1バイトコード */
- *d++ = c;
- } else { /* 2バイトコード:もしくは拡張 */
- *d++ = c;
- *d++ = *s++;
- }
- }
- } else {
- *d = EOS;
- break; /* EOS で終わり */
- }
- }
- }
-
-